package com.loveprogrammer.eternity.skill;


import com.loveprogrammer.eternity.model.Character;
import com.loveprogrammer.eternity.common.Tuple;
import com.loveprogrammer.eternity.model.attack.AttackResult;
import com.loveprogrammer.eternity.notify.Notify;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService;

/**
 * @version 1.0.0
 * @description: 技能接口
 * @author: eric
 * @date: 2022-08-11 16:48
 **/
public interface Skill{

    /**
     * 是否可以发动
     **/
    boolean check(Character character);

    /**
     * 被动技能的发动时机 99 固定属性提升技能 1 光环技能（死亡后技能效果要消除掉） 2 被动防御技能 3 召唤类型
     * 如果为0 表示为主动技能
     **/
    int opportunityPassive();

    /**
     * 发动技能
     **/
    Tuple<String, List<Character>> launch(Character character,
                                          List<? extends Character> attack,
                                          List<? extends Character> defences,
                                          ScheduledExecutorService subFightExecutorService);

    /**
     * 解除技能 用于光环型技能英雄死亡后效果的解除
     **/
    void release(Character character,
                 List<? extends Character> attack,
                 List<? extends Character> defences);

    /**
     * 是否可以升级
     **/
    boolean checkLevelUp(int characterLevel);

    /**
     * 升级
     **/
    boolean levelUp(int characterLevel);

    void setLevel(int level);

    /**
     * 技能名称
     **/
    String getName();

    /**
     * 技能id
     **/
    int getId();

    /**
     * 技能说明
     **/
    String getDesc();

    /**
     * 最大级别
     **/
    int maxLevel();

    /**
     * 剩余间隔
     **/
    int restInterval();

    /**
     * 减少间隔
     **/
    void reduceInterval();

    int order();

    /**
     * 暴击检查
     **/
    boolean critCheck(Character character);

    void computeLevelByCharacterLevel(int level);

    Skill assembleAttackEntity(AttackResult attackResult);

    // 配置
    Skill assemble(Map<String,Object> properties);

    int defaultHarm();

    boolean canBeDodged();

    String print();

    void levelUpInit(int level, int acquiredLevel);
}
